home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / term-source.lha / Colour.c < prev    next >
C/C++ Source or Header  |  1996-10-20  |  6KB  |  278 lines

  1. /*
  2. **    Colour.c
  3. **
  4. **    Colour table support code
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16.     /* ColourTablex12(ColourTable *Table,UWORD *Dest12,LONG NumColours):
  17.      *
  18.      *    Convert colour table into 12 bit precision colours.
  19.      */
  20.  
  21. STATIC VOID
  22. ColourTablex12(ColourTable *Table,UWORD *Dest12,LONG NumColours)
  23. {
  24.     LONG i;
  25.  
  26.     for(i = 0 ; i < NumColours ; i++)
  27.         Colour96x12(&Table->Entry[i].Red,&Dest12[i],1);
  28. }
  29.  
  30.     /* Colour96xColourTable(ULONG *Source96,ColourTable *Table,LONG NumColours):
  31.      *
  32.      *    Convert 96 bit precision colours for colour table.
  33.      */
  34.  
  35. VOID
  36. Colour96xColourTable(ULONG *Source96,ColourTable *Table,LONG NumColours)
  37. {
  38.     LONG i;
  39.  
  40.     for(i = 0 ; i < NumColours ; i++)
  41.     {
  42.         Table->Entry[i].Red        = *Source96++;
  43.         Table->Entry[i].Green    = *Source96++;
  44.         Table->Entry[i].Blue    = *Source96++;
  45.     }
  46. }
  47.  
  48.     /* Colour12xColourTable(UWORD *Source12,ColourTable *Table,LONG NumColours):
  49.      *
  50.      *    Convert 12 bit precision colours for colour table.
  51.      */
  52.  
  53. VOID
  54. Colour12xColourTable(UWORD *Source12,ColourTable *Table,LONG NumColours)
  55. {
  56.     LONG i;
  57.  
  58.     for(i = 0 ; i < NumColours ; i++)
  59.         Colour12x96(&Source12[i],&Table->Entry[i].Red,1);
  60. }
  61.  
  62.     /* Colour12x96(UWORD *Source12,ULONG *Dest96,LONG NumColours):
  63.      *
  64.      *    Convert 12 bit precision colours into 96 bit colours.
  65.      */
  66.  
  67. VOID
  68. Colour12x96(UWORD *Source12,ULONG *Dest96,LONG NumColours)
  69. {
  70.     ULONG r,g,b;
  71.     LONG v;
  72.  
  73.     do
  74.     {
  75.         v = *Source12++;
  76.  
  77.         r = (v & 0xF00) >> 8;
  78.         g = (v & 0x0F0) >> 4;
  79.         b = (v & 0x00F);
  80.  
  81.         *Dest96++ = SPREAD((r << 4) | r);
  82.         *Dest96++ = SPREAD((g << 4) | g);
  83.         *Dest96++ = SPREAD((b << 4) | b);
  84.     }
  85.     while(--NumColours);
  86. }
  87.  
  88.     /* Colour96x12(UWORD *Source12,ULONG *Dest96,LONG NumColours):
  89.      *
  90.      *    Convert 96 bit precision colours into 12 bit colours.
  91.      */
  92.  
  93. VOID
  94. Colour96x12(ULONG *Source96,UWORD *Dest12,LONG NumColours)
  95. {
  96.     ULONG r,g,b;
  97.  
  98.     do
  99.     {
  100.         r = (*Source96++) >> 28;
  101.         g = (*Source96++) >> 28;
  102.         b = (*Source96++) >> 28;
  103.  
  104.         *Dest12++ = (r << 8) | (g << 4) | b;
  105.     }
  106.     while(--NumColours);
  107. }
  108.  
  109.     /* CopyColourEntry(ColourTable *Source,ColourTable *Destination,LONG From,LONG To):
  110.      *
  111.      *    Copy one colour register from one place to another.
  112.      */
  113.  
  114. VOID
  115. CopyColourEntry(ColourTable *Source,ColourTable *Destination,LONG From,LONG To)
  116. {
  117.     if(From >= 0 && To >= 0 && From < Source->NumColours && To < Destination->NumColours)
  118.     {
  119.         Destination->Entry[To].Red        = Source->Entry[From].Red;
  120.         Destination->Entry[To].Green    = Source->Entry[From].Green;
  121.         Destination->Entry[To].Blue        = Source->Entry[From].Blue;
  122.     }
  123. }
  124.  
  125.     /* ColourTablex96(ColourTable *Table,ULONG *Dest96):
  126.      *
  127.      *    Convert colour table to 96 bit RGB palette.
  128.      */
  129.  
  130. VOID
  131. ColourTablex96(ColourTable *Table,ULONG *Dest96)
  132. {
  133.     LONG i;
  134.  
  135.     for(i = 0 ; i < Table->NumColours ; i++)
  136.     {
  137.         *Dest96++ = Table->Entry[i].Red;
  138.         *Dest96++ = Table->Entry[i].Green;
  139.         *Dest96++ = Table->Entry[i].Blue;
  140.     }
  141. }
  142.  
  143.     /* DeleteColourTable(ColourTable *Table):
  144.      *
  145.      *    Delete a colour table.
  146.      */
  147.  
  148. VOID
  149. DeleteColourTable(ColourTable *Table)
  150. {
  151.     FreeVecPooled(Table);
  152. }
  153.  
  154.     /* CreateColourTable(LONG NumEntries,UWORD *Source12,ULONG *Source96):
  155.      *
  156.      *    Create a colour table and fill it with given data.
  157.      */
  158.  
  159. ColourTable *
  160. CreateColourTable(LONG NumEntries,UWORD *Source12,ULONG *Source96)
  161. {
  162.     ColourTable *Record;
  163.  
  164.     if(Record = (ColourTable *)AllocVecPooled(sizeof(ColourTable) + NumEntries * sizeof(ColourEntry),MEMF_ANY | MEMF_CLEAR))
  165.     {
  166.         LONG i;
  167.  
  168.         Record->NumColours = NumEntries;
  169.  
  170.         for(i = 0 ; i < NumEntries ; i++)
  171.         {
  172.             Record->Entry[i].One    = 1;
  173.             Record->Entry[i].Which    = i;
  174.         }
  175.  
  176.         Record->Entry[NumEntries].One = 0;
  177.  
  178.         if(Source12)
  179.             Colour12xColourTable(Source12,Record,NumEntries);
  180.  
  181.         if(Source96)
  182.             Colour96xColourTable(Source96,Record,NumEntries);
  183.     }
  184.  
  185.     return(Record);
  186. }
  187.  
  188.     /* LoadColours(struct ViewPort *VPort,ColourTable *Table,UWORD *Colour12,LONG NumColours):
  189.      *
  190.      *    Load a colour table.
  191.      */
  192.  
  193. VOID
  194. LoadColourTable(struct ViewPort *VPort,ColourTable *Table,UWORD *Colour12,LONG NumColours)
  195. {
  196.     if(Kick30 && Table)
  197.         LoadRGB32(VPort,(ULONG *)Table->Entry);
  198.     else
  199.     {
  200.         if(Colour12)
  201.             LoadRGB4(VPort,(UWORD *)Colour12,NumColours);
  202.         else
  203.         {
  204.             if(Table)
  205.             {
  206.                 UWORD *Dest12;
  207.  
  208.                 if(Dest12 = (UWORD *)AllocVecPooled(sizeof(UWORD) * NumColours,MEMF_ANY))
  209.                 {
  210.                     ColourTablex12(Table,Dest12,NumColours);
  211.  
  212.                     LoadRGB4(VPort,Dest12,NumColours);
  213.  
  214.                     FreeVecPooled(Dest12);
  215.                 }
  216.                 else
  217.                 {
  218.                     LONG i;
  219.  
  220.                     for(i = 0 ; i < Table->NumColours ; i++)
  221.                         SetRGB4(VPort,i,Table->Entry[i].Red >> 28,Table->Entry[i].Green >> 28,Table->Entry[i].Blue >> 28);
  222.                 }
  223.             }
  224.         }
  225.     }
  226. }
  227.  
  228.     /* GrabColours(struct ViewPort *VPort,ColourTable *Table):
  229.      *
  230.      *    Copies the colour palette of the given viewport into the table.
  231.      */
  232.  
  233. VOID
  234. GrabColours(struct ViewPort *VPort,ColourTable *Table)
  235. {
  236.     if(Kick30)
  237.     {
  238.         LONG i;
  239.  
  240.         for(i = 0 ; i < Table->NumColours ; i++)
  241.             GetRGB32(VPort->ColorMap,i,1,(ULONG *)&Table->Entry[i].Red);
  242.     }
  243.     else
  244.     {
  245.         LONG    Value;
  246.         LONG    i;
  247.  
  248.         for(i = 0 ; i < Table->NumColours ; i++)
  249.         {
  250.             Value = GetRGB4(VPort->ColorMap,i);
  251.  
  252.             Table->Entry[i].Red        = ((Value & 0xF00) >> 8) * 0x11111111;
  253.             Table->Entry[i].Green    = ((Value & 0x0F0) >> 4) * 0x11111111;
  254.             Table->Entry[i].Blue    =  (Value & 0x00F)       * 0x11111111;
  255.         }
  256.     }
  257. }
  258.  
  259.     /* CopyColours(ColourTable *From,ColourTable *To):
  260.      *
  261.      *    Copy colours from one table to another.
  262.      */
  263.  
  264. VOID
  265. CopyColours(ColourTable *From,ColourTable *To)
  266. {
  267.     LONG i,Min;
  268.  
  269.     Min = MIN(From->NumColours,To->NumColours);
  270.  
  271.     for(i = 0 ; i < Min ; i++)
  272.     {
  273.         To->Entry[i].Red    = From->Entry[i].Red;
  274.         To->Entry[i].Green    = From->Entry[i].Green;
  275.         To->Entry[i].Blue    = From->Entry[i].Blue;
  276.     }
  277. }
  278.